package com.boot.study;

import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.ObjectId;
import org.dromara.pdf.fop.doc.XEasyPdfTemplateDocument;
import org.dromara.pdf.fop.doc.bookmark.XEasyPdfTemplateBookmark;
import org.dromara.pdf.fop.doc.component.barcode.XEasyPdfTemplateBarcode;
import org.dromara.pdf.fop.doc.component.table.XEasyPdfTemplateTable;
import org.dromara.pdf.fop.doc.component.table.XEasyPdfTemplateTableRow;
import org.dromara.pdf.fop.doc.component.text.XEasyPdfTemplateText;
import org.dromara.pdf.fop.doc.component.text.XEasyPdfTemplateTextExtend;
import org.dromara.pdf.fop.doc.page.XEasyPdfTemplatePage;
import org.dromara.pdf.fop.handler.XEasyPdfTemplateHandler;

import java.util.ArrayList;
import java.util.List;

/**
 * @author lkz
 * @className XEasyPdfTemplateAllTest
 * @description 源码demo
 * @date 2024/2/28 9:40
 **/
public class XEasyPdfTemplateAllTest {


    public static void main(String[] args) {
        new XEasyPdfTemplateAllTest().createDocument();
    }

    public void createDocument(){
        // 定义输出路径
        String outputPath="D:\\pdf\\test\\"+ ObjectId.next()+".pdf";
        // 定义书签
        XEasyPdfTemplateBookmark bookmark = XEasyPdfTemplateHandler.Bookmark.build()
        //设置标题
                .setTitle("目录")
                //设置内部地址（对应组件id）
                .setInternalDestination("title");
        //创建标题
        XEasyPdfTemplateText title = XEasyPdfTemplateHandler.Text.build()
                .setFontFamily("宋体") //设置字体
                .setId("title") //设置id
                .setText("贵阳市简介") // 设置文本
                .setFontSize("20pt") //设置字体大小
                .setHorizontalStyle("center");// 设置水平位置居中
//.setVerticalStyle("center") // 设置垂直居中
        //创建扩展文本
        XEasyPdfTemplateTextExtend createText = XEasyPdfTemplateHandler.TextExtend.build()
                .setFontSize("12pt") // 设置字体
                .setSpaceBefore("12pt") // 设置段前空白页面
                .setStartIndent("60pt") // 设置段落缩进
                .setTextSpacing("80pt") // 设置文本间隔
                .addText(
                        XEasyPdfTemplateHandler.Text.build().setText("创建时间:" + DateUtil.format(new DateTime(), "yyyy-MM-dd HH:mm:ss")),
                        XEasyPdfTemplateHandler.Text.build().setText("创建人: 橙哈哈")
                );
        // 创建二维码
        XEasyPdfTemplateBarcode barcode = XEasyPdfTemplateHandler.Barcode.build()
                .setType("qr_code")// 设置条形码类型
                .setContent("https://baike.baidu.com/item/贵阳/438289")
                .setWords("扫一扫")
                .setWidth("60pt")
                .setHeight("60pt")
                .setHorizontalStyle("right") // 水平位置局右
                .setMarginTop("-62pt");// 设置上移-62
// 创建内容
        XEasyPdfTemplateText text = XEasyPdfTemplateHandler.Text.build().setFontFamily("微软雅黑")
                .setText("" +
                        "贵阳，简称“筑”，别称林城、筑城，贵州省辖地级市、省会、Ⅰ型大城市，国务院批复确定的中国西南地区重要的中心城市之一、" +
                        "重要的区域创新中心和全国重要的生态休闲度假旅游城市。" +
                        "贵阳地处黔中山原丘陵中部，东南与黔南布依族苗族自治州的瓮安、龙里、惠水、长顺4县接壤，" +
                        "西靠安顺市的平坝区和毕节市的织金县，北邻毕节市的黔西市、金沙县和遵义市的播州区，" +
                        "截至2020年，全市下辖6个区、3个县，代管1个县级市。截至2021年末，贵阳市常住人口610.23万人。"
                )
                .setSpaceBefore("20pt") // 设置段前空白
                .setTextIndent("20pt");//设置文本缩进
// 创建内容
        XEasyPdfTemplateText remark = XEasyPdfTemplateHandler.Text.build()
                // 设置文本
                .setText("-- 摘自百度百科")
                // 设置字体大小
                .setFontSize("12pt")
                // 设置水平居右
                .setHorizontalStyle("right");

        //创建子书签
        XEasyPdfTemplateBookmark child = XEasyPdfTemplateHandler.Bookmark.build()
                .setTitle("贵阳市行政区划分子标签") // 设置标题
                .setInternalDestination("tableText");// 设置内部地址（对应组件id）
        // 添加子书签
        bookmark.addChild(child);
        // 创建内容
        XEasyPdfTemplateText tableText = XEasyPdfTemplateHandler.Text.build()
                // 设置id
                .setId("tableText")
                //设置文本
                .setText("贵阳市行政区划分")
                // 设置字体大小
                .setFontSize("20pt")
                // 设置当前位置分页
                .setBreakBefore("page")//  表示下面的表格在新的页面生成 不然就是紧挨着上面的数据
                // 设置段前空白
                .setSpaceBefore("20pt")
                //设置水平居右
                .setHorizontalStyle("center");

        // 创建表格
        XEasyPdfTemplateTable table = XEasyPdfTemplateHandler.Table.build()
                .setHeader(
                        XEasyPdfTemplateHandler.Table.Header.build().addRow(
                                this.createRow("#7C7D7D", "center", "名称", "区划代码", "人口（万人）", "面积（平方千米）")
                        )
                )
                .setBody(
                        // 设置表格主体
                        XEasyPdfTemplateHandler.Table.Body.build().addRow(initDate()))
                .setMinRowHeight("30pt")
                .setVerticalStyle("center");
        //创建文档
        XEasyPdfTemplateDocument document = XEasyPdfTemplateHandler.Document.build();
        XEasyPdfTemplatePage page = XEasyPdfTemplateHandler.Page.build()
                // 设置页面id
                .setId("pageId")
                // 设置字体
                .setFontFamily("思源宋体")
                // 设置字体大小
                .setFontSize("15pt")
                // 设置边距（上下左右）
                .setMargin("20pt")
                //.setHeight("650pt")
                // 设置主体内容
                .addBodyComponent(title, createText, barcode, text, remark, tableText, table)
                // 设置页脚高度
                .setFooterHeight("20pt")
                // 设置页脚内容
                .addFooterComponent(
                        // 创建块容器并添加内容
                        XEasyPdfTemplateHandler.BlockContainer.build().addComponent(
                                        // 创建文本
                                        XEasyPdfTemplateHandler.Text.build().setText("第 "),
                                        // 创建当前页码
                                        XEasyPdfTemplateHandler.CurrentPageNumber.build(),
                                        XEasyPdfTemplateHandler.Text.build().setText(" 页，共 "),
                                        // 创建总页码并设置页面id
                                        XEasyPdfTemplateHandler.TotalPageNumber.build().setPageId("pageId"),
                                        XEasyPdfTemplateHandler.Text.build().setText(" 页")
                                ).setHorizontalStyle("center")
                                .setMargin("10pt")
                )
                // 设置主体水印
                .setBodyWatermark(
                        // 创建文字水印
                        XEasyPdfTemplateHandler.Watermark.build()
                                // 设置水印图片目录
                                .setTempDir("D:\\PDF\\test\\fo")
                                // 设置水印id
                                .setId("watermark")
                                // 设置水印内容
                                .setText("贵阳", "x-easypdf")
                                // 设置水印图像宽度
                                .setWidth("600pt")
                                // 设置水印图像高度
                                .setHeight("300pt")
                                // 设置水印显示宽度
                                .setShowWidth("200pt")
                                // 设置文字大小
                                .setFontSize("100pt")
                                // 设置文字颜色
                                .setFontColor("gray")
                                // 设置文字透明度
                                .setFontAlpha("100")
                                // 设置逆时针旋转
                                .setRadians("-45")
                                // 开启文件覆盖
                                .enableOverwrite()
                );
        // 添加页面、书签并转换
        document.addPage(page).addBookmark(bookmark).transform(outputPath);


    }

    public List<XEasyPdfTemplateTableRow> initDate(){
        List<XEasyPdfTemplateTableRow> rowList=new ArrayList<>();
        for(int i=1;i<=100;i++){

            if(i<=50){
                rowList.add(this.createRow(null, "left", "贵阳市"+i, "520100", "599", "8035"));
            }else{
                rowList.add(this.createRow(null, "right", "北京"+i, "520100", "599", "8035"));
            }

        }
        return rowList;
    }


    private XEasyPdfTemplateTableRow createRow(String backgroundColor, String style, String... texts) {
        XEasyPdfTemplateTableRow row = XEasyPdfTemplateHandler.Table.Row.build();
        for (int i = 0; i < texts.length; i++) {
            row.addCell(
                    XEasyPdfTemplateHandler.Table.Cell.build().addComponent(
                            XEasyPdfTemplateHandler.Text.build().setText(texts[i])
                    ).setBorderStyle("solid").setBackgroundColor(backgroundColor).setHorizontalStyle(style)
            );
        }
        return row;
    }



}
